; $Id: Install 1.16 2009/02/05 20:38:13 wepl Exp wepl $

(set #multiple-versions "")		;set to <> "" if there are multiple versions
(set #version 3)			;set if no multiple versions 0=RawDIC 1=Patcher 2=DIC 3=Files 4=CD 5=SingleFile
(set #sub-dir "")			;sub directory containing data files
(set #highs-file "highs")		;name of high scores file

(set #readme-file "ReadMe")		;name of readme file
(set #man-file "Manual")		;name of manual file
(set #hint-file "Hints")		;name of hint file
(set #sol-file "Solution")		;name of solution file
(set #extra-file "Extra")		;name of extra file
(set #extra2-file "Extra2")		;name of second extra file
(set #extra3-file "Extra3")		;name of third extra file
(set #prefix @app-name)			;name of slave, directory
(set #prefix-slave "")

(set #ico_suffix_00 "inf")		;Icon suffixes (not all of these must exist)
(set #ico_suffix_01 "magicwb")
(set #ico_suffix_02 "romicon")
(set #ico_suffix_03 "newicon")
(set #ico_suffix_04 "newicon2")
(set #ico_suffix_05 "newexot")
(set #ico_suffix_06 "newcfou")
(set #ico_suffix_07 "colicon")
(set #ico_suffix_08 "colicon2")
(set #ico_suffix_09 "colicon3")
(set #ico_suffix_10 "colexot")
(set #ico_suffix_11 "colfrank")
(set #ico_suffix_12 "colchris")
(set #ico_suffix_13 "colcode")
(set #ico_suffix_14 "colcfou")
(set #ico_suffix_15 "colcfou2")
(set #ico_suffix_16 "colzarkov")
(set #ico_suffix_17 "boxicon")

;Icon descriptions (max 21 chars if you have > 9 entries, or 27 chars otherwise.
;These are renamed to "gamename.info" so no illegal characters like :/* etc
;		  "123456789012345678901234567"
(set #ico_desc_00 "Normal")
(set #ico_desc_01 "MagicWB Icon")
(set #ico_desc_02 "RomIcon")
(set #ico_desc_03 "NewIcon")
(set #ico_desc_04 "NewIcon 2")
(set #ico_desc_05 "NewIcon by Exotica")
(set #ico_desc_06 "NewIcon by CFou!")
(set #ico_desc_07 "OS3.5 Icon")
(set #ico_desc_08 "OS3.5 Icon 2")
(set #ico_desc_09 "OS3.5 Icon 3")
(set #ico_desc_10 "OS3.5 Icon by Exotica")
(set #ico_desc_11 "OS3.5 Icon by Frank")
(set #ico_desc_12 "OS3.5 Icon by Chris Vella")
(set #ico_desc_13 "OS3.5 Icon by Codetapper")
(set #ico_desc_14 "OS3.5 Icon by CFou!")
(set #ico_desc_15 "OS3.5 Icon by CFou! 2")
(set #ico_desc_16 "OS3.5 Icon by Dr.Zarkov")
(set #ico_desc_17 "OS3.5 BoxIcon")

;---------------------------------------------------------------------
; Which version does the user want to install? This routine doesn't need
; to be changed UNLESS there are multiple versions.

(procedure P_SelectVersion
  (if (= #multiple-versions "")
    ("")
    (
      (set #version
        (askchoice
          (prompt ("Which version of %s would you like to install?" @app-name))
          (default 0)
	  ;
	  ; it is recommend to simply set choices which are not required to an
	  ; empty string ala "", because then other procedures must bot changed
	  ; because the number of the #version remains unchanged
	  ;
	  (choices
		"Original release (RawDIC)"
		"Alternate version (Patcher)"
		"Budget re-release (DIC)"
		"Hit-Squad version (Files)"
		"CD/CDTV/CD version (Files)"
		"Defjam compact (Single File)"
	  )
          (help @askchoice-help)
        )
      )
      ;
      ; Certain versions may use different slaves, islaves, imager and icons.
      ;	This can be set up here if required.
      ; If you set #prefix it will change: install directory, islave, imager
      ; and icon. If you set #prefix-slave it only changes the slave name.
      ; You may also set the #sub-dir here if this is not required with all
      ; versions
      ;                                                                         
      (select #version
	; 0 = RawDIC
        ("")
	; 1 = Patcher
        ("")
	; 2 = DIC
        ("")
	; 3 = Files
	(set #prefix ("%s%s" #prefix "AGA"))
	; 4 = CD Files
	(
	  (set #prefix-slave (cat #prefix "CDTV"))
	  (set #sub-dir "data")
	)
	; 5 = Single File
	("")
      )
    )
  )
)

;---------------------------------------------------------------------
; Make the disk images for the install

(procedure P_MakeImages
  (select #version
    (				;----- 0 = RawDIC -----
      (set #last-file "Disk.1")		;last file the imager should create
      (copyfiles
        (help @copyfiles-help)
        (source ("%s.ISlave" #prefix))
        (dest #dest)
      )
      (P_AskSrcDrvRaw)
      (working "calling RawDIC...")
      (run ("CD \"%s\"\nRawDIC SLAVE=%s.islave SOURCE=%s\nDelete %s.ISlave Quiet" #dest #prefix #CI_drive #prefix))
      (if (exists (tackon #dest #last-file))
        ("")
        (abort "Disk imaging was not successful!\nRawDIC was unable to create all needed files!")
      )
    )

    (				;----- 1 = Patcher -----
      (set #last-file "Disk.1")		;last file the imager should create
      (copyfiles
        (help @copyfiles-help)
        (source ("%s.imager" #prefix))
        (dest #dest)
      )
      (P_AskSrcDrvRaw)
      (working "calling Patcher...")
      (run ("CD \"%s\"\nPatcher -p%s.imager -s%s\nDelete %s.imager Quiet" #dest @app-name #CI_drive @app-name))
      (if (exists (tackon #dest #last-file))
        ("")
        (abort "Disk imaging was not successful!\nThe Patcher was unable to create all needed files!")
      )
    )

    (				;----- 2 = DIC (Disk Images) -----
  
      ;the following lines must be copied and adjusted for multiple disk images
  
      (set #CI_disknum 1)
      (set #CI_diskname ("%s Disk %ld" @app-name #CI_disknum))
      (set #CI_disklen 901120)
      (set #CI_skiptrk "")
      (P_CreateImage)

      ;for example...
      (set #CI_disknum 2)
      (set #CI_diskname ("%s Disk %ld" @app-name #CI_disknum))
      (P_CreateImage)

    )

    (				;----- 3 = DOS (Files) -----
      (set #AD_disk "A")
      (P_AskDisk)
      (copyfiles
        (help @copyfiles-help)
        (source ("%s:" #AD_disk))
        (dest #dest)
        (pattern "~(c|devs|s|.#?|intro)")
      )
      (set #AD_disk "B")
      (P_AskDiskDev)
      (copyfiles
        (help @copyfiles-help)
        (source ("%s:" #AD_disk))
        (dest #dest)
        (pattern "~(#?.info)")
      )
      (set #file (tackon #dest "Enemy"))
      (P_XFDDecrunch)
    )

    (				;----- 4 = CD (Files) -----
      (message ("\nInsert your %s CD in any drive." @app-name))
      (copyfiles
        (help @copyfiles-help)
        (source "HolidayMakerCDTV:")
        (pattern "(fonts|[1-9hnp]#?|de|map|se)")
        (dest #dest)
      )
      (copyfiles
        (help @copyfiles-help)
        (source "HolidayMakerCDTV:libs")
        (pattern "diskfont.library")
        (dest #dest)
      )
    )

    (				;----- 5 = DOS (Select a single file on an unknown disk) -----
      (set #SF_prompt "Please select the xxxxxx file (xxxxxx bytes)")
      (set #SF_default_filename "xxxxxx")
      (set #SF_new_filename #SF_default_filename)
      (P_SelectFile)
      (if (= #SF_filename "")
        (abort ("Disk imaging was not successful!\nCould not locate the required file\n%s\n" #SF_default_filename))
      )
      (copyfiles
        (help @copyfiles-help)
        (source #SF_filename)
        (dest #dest)
        (newname #SF_new_filename)
      )
    )
  )
)

;----------------------------
; Create all the icons for the install. If the game requires multiple icons
; set them up here by calling P_SelectIcon multiple times, one for each
; icon/slave that the game needs. For 99% of cases, you do not need to 
; change this routine.
;
; If you have not setup the WHDLoad tooltypes in the icons, you should
; change the line(s) below to (set #icon_set_slave_preload "true")

(procedure P_MakeIcons
  ; Uncomment the following lines if you have a separate intro slave/icon
  ;(set #icon_desc "intro")
  ;(set #icon_prefix ("%s%s" #prefix #icon_desc))
  ;(set #icon_slave #prefix-slave)
  ;(set #icon_set_slave_preload "")
  ;(set #icon_set_deftool_stack "true")
  ;(P_CopySlave)
  ;(P_SelectIcon)

  (set #icon_desc "game")
  (set #icon_prefix #prefix)
  (set #icon_slave #prefix-slave)
  (set #icon_set_slave_preload "")
  (set #icon_set_deftool_stack "true")
  (P_CopySlave)
  (P_SelectIcon)
)


; ** ATTENTION! YOU SHOULD NOT HAVE TO CHANGE ANYTHING BEYOND THIS POINT! **


;****************************
;----------------------------
; checks if given program is installed, if not abort install
; #program - to check

(procedure P_ChkRun
  (set #package "WHDLoad (http://www.whdload.de)")
  (P_ChkRun_Package)
)
(procedure P_ChkRun_Package
  (if (= 0 (run ("cd SYS:\nWhich %s >NIL:" #program)))
    ("")
    (abort
      (cat
	"You must install \"" #program "\" first!\n"
	"It must be accessible via the path.\n"
	"You can find it in the package " #package "."
      )
    )
  )
)

;----------------------------
; decrunch one file using XFD package
; IN:  #file - file to decrunch (full path)
; OUT: -

(procedure P_XFDDecrunch
  (set #program "xfddecrunch")
  (set #package "XFD (aminet:util/pack/xfdmaster.lha)")
  (P_ChkRun_Package)
  (if
    (<> 0 (run ("%s \"%s\" >CON:///1000//CLOSE" #program #file)))
    (abort ("\"%s\" has failed to decompress the file \"%s\"" #program #file))
  )
)

;----------------------------
; variables to handle disk image files

(set #DI_mode 9)
(set #DI_image "SYS:")
(set #DI_imagetmp "T:WHDI.image")
(set #DI_mount "T:WHDI.mountlist")
(set #DI_dev "WHDI")

;----------------------------
; functions to handle disk image files
; ask the name of the image file
; IN:  -
; OUT: -

(procedure PDI_AskMode
  (if (> #DI_mode 3)
    (set #DI_mode
      (askchoice
	(prompt "In which form of media are your disks to install this program?")
	(default 0)
	(choices
	  "real floppy disks"
	  "standard disk images (adf, 901120 bytes)"
	  "CAPS/SPS images or warp files (ipf,mfm,wrp,wwp,...)"
	)
	(help
	  "To install from 'real floppy disks' you have to insert your physically disks into"
	  " any of your floppy drives.\n\n"
	  "To install from 'disk images' you must have installed the DiskImage package"
	  " (aminet:disk/misc/diskimage.lha). Required is DEVS:diskimage.device and the"
	  " program DiskImageCtrl in the path.\n\n"
	  "To install from 'warp files' you must additionally have installed"
	  " the TrackWarp package (http://www.whdload.de/whdload/TrackWarp15.lha). Required"
	  " is LIBS:trackwarp.library and the program tw2adf in the path. tw2adf must have"
	  " version 1.1 or better.\n\n"
	  "To install from 'CAPS images' you must additionally have installed the"
	  " capsimage.device in DEVS: (http://www.caps-project.org/)\n\n"
	  @askchoice-help
	)
      )
    )
  )
)

;----------------------------
; functions to handle disk image files
; ask the name of the image file
; IN:  #DI_diskname - name of the disk to insert
; OUT: -

(procedure PDI_AskImage
  (if (getenv "WHDLImage")
    (set #DI_image (getenv "WHDLImage"))
  )
  (set #DI_image
    (askfile
      (prompt "Please select disk image which is the disk named \"" #DI_diskname "\".\n"
		"Beware the Installer has problems with long file names!")
      (default #DI_image)
      (help @askfile-help)
    )
  )
  (run ("setenv WHDLImage \"%s\"\ncopy ENV:WHDLImage ENVARC:" #DI_image))
)

;----------------------------
; functions to handle disk image files
; insert the image file into the virtual drive
; IN:  -
; OUT: -

(procedure PDI_Insert
  (if 
    (<> 0 (run ("DiskImageCtrl Drive=%s: ReadOnly Image=\"%s\" >CON:///1000//CLOSE/AUTO" #DI_dev #DI_image)))
    (abort 
	"Sorry, could not load the Image to the Device.\n"
	"Make sure you have correctly installed aminet:disk/misc/diskimage.lha,\n"
	"you have selected the right disk image\n"
	"and there are enough free ressources."
    )
  )
)

;----------------------------
; functions to handle disk image files
; convert alien image to adf
; IN:  -
; OUT: -

(procedure PDI_Convert
  (set #program "tw2adf")
  (set #package "TrackWarp (http://www.whdload.de/whdload/TrackWarp15.lha)")
  (P_ChkRun_Package)
  (run ("DiskImageCtrl Drive=%s: Eject >CON:///1000//CLOSE/AUTO" #DI_dev))
  (if
    (<> 0 (run ("tw2adf \"%s\" %s Quiet Overwrite >CON:///1000//CLOSE/AUTO" #DI_image #DI_imagetmp)))
    (abort
	"Sorry, could not convert the specified image file.\n"
	"Make sure you have correctly installed the package " #package
	" and there is enough free memory."
    )
  )
  (set #DI_image #DI_imagetmp)
)

;----------------------------
; functions to handle disk image files
; mount the virtual drive
; IN:  -
; OUT: -

(procedure PDI_Mount
  (set #program "DiskImageCtrl")
  (set #package "DiskImage (aminet:disk/misc/diskimage.lha)")
  (P_ChkRun_Package)
  (if (getassign #DI_dev "d")
    ("")
    (
      (textfile
	(dest #DI_mount)
        (append
		"/**/\n"
		#DI_dev ":\n"
		"\tDevice = diskimage.device\n"
		"\tUnit = 9\n"
		"\tFlags = 0\n"
		"\tSurfaces = 2\n"
		"\tBlocksPerTrack = 11\n"
		"\tReserved = 2\n"
		"\tLowCyl = 0\n"
		"\tHighCyl = 79\n"
		"\tStackSize = 4096\n"
		"\tGlobVec = -1\n"
		"\tActivate = 1\n"
        )
        (help @textfile-help)
      )
      (if 
	(<> 0 (run ("mount %s: FROM %s >CON:///1000//CLOSE/AUTO" #DI_dev #DI_mount)))
        (abort 
	  "Sorry, could not mount the Device " #DI_dev ":.\n"
	  "Make sure you have correctly installed the package " #package "\n"
	  "and there are enough free ressources and Unit #9 is not already used."
        )
      )
    )
  )
)

;----------------------------
; Wait for inserting a named disk
; IN:  #AD_disk - name of disk
;      #AD_diskname - optional name of disk to request
; OUT: -

(procedure P_AskDisk
  (if #AD_diskname
    ("")
    (set #AD_diskname #AD_disk)
  )
  (PDI_AskMode)
  (set #DI_diskname #AD_diskname)
  (select #DI_mode
    ;0 = floppy
    (askdisk
      (dest #AD_disk)
      (prompt ("\nInsert Disk \"%s\" in any drive!" #AD_diskname))
      (help @askdisk-help)
    )
    ;1 = adf
    (
      (PDI_Mount)
      (until
	(getassign #AD_disk "v")
	(PDI_AskImage)
	(PDI_Insert)
	(run "wait 1")
      )
    )
    ;2 = warp
    (
      (PDI_Mount)
      (until
	(getassign #AD_disk "v")
	(PDI_AskImage)
	(PDI_Convert)
	(PDI_Insert)
	(run "wait 1")
      )
    )
  )
  (set #AD_diskname "")
)

;----------------------------
; Wait for inserting a disk with a volume label not useable for P_AskDisk
; IN:  #AD_diskname - name of disk to request
; OUT: #AD_drive - device name in which the disk has been inserted

(procedure P_AskDiskDev
  (PDI_AskMode)
  (set #DI_diskname #AD_diskname)
  (select #DI_mode
    ;0 = floppy
    (
      (P_AskSrcDrv)
      (set #AD_drive #CI_drive)
      (message
        (cat
	  "\nInsert \"" #AD_diskname "\" into drive " #AD_drive "!\n\n"
	  "(make sure it's the right disk because it will not be checked)"
	)
      )
    )
    ;1 = adf
    (
      (PDI_Mount)
      (PDI_AskImage)
      (PDI_Insert)
      (run "wait 1")
      (set #AD_drive #DI_dev)
    )
    ;2 = warp
    (
      (PDI_Mount)
      (PDI_AskImage)
      (PDI_Convert)
      (PDI_Insert)
      (run "wait 1")
      (set #AD_drive #DI_dev)
    )
  )
)

;----------------------------
; ask for source drive (DIC installs)

(procedure P_AskSrcDrv
  (if #CI_drive
    ("")
    (
      (set #dcnt 0)
      (set #CI_cfg (getenv "WHDLSrcDrv"))
      (if (#CI_cfg)
        (if (getassign (substr #CI_cfg 0 (- (strlen #CI_cfg) 1)) "d")
          (set #dcnt (+ 1 #dcnt)) (set #CI_cfg "")
        )
      )
      (set #CI_df0 "")
      (if (<> "DF0:" #CI_cfg)
        (if (getassign "DF0" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df0 "DF0:")))
      )
      (set #CI_df1 "")
      (if (<> "DF1:" #CI_cfg)
        (if (getassign "DF1" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df1 "DF1:")))
      )
      (set #CI_df2 "")
      (if (<> "DF2:" #CI_cfg)
        (if (getassign "DF2" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df2 "DF2:")))
      )
      (set #CI_df3 "")
      (if (<> "DF3:" #CI_cfg)
        (if (getassign "DF3" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df3 "DF3:")))
      )
      (set #CI_rad "")
      (if (<> "RAD:" #CI_cfg)
        (if (getassign "RAD" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_rad "RAD:")))
      )
      (set #CI_ff0 "")
      (if (<> "FF0:" #CI_cfg)
        (if (getassign "FF0" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_ff0 "FF0:")))
      )
      (if (< #dcnt 1) (set #CI_cfg "DF0:"))
      (set #CI_ask "Enter Device Name")
      (set #CI_drive
        (askchoice
          (prompt "Select source drive for diskimages")
          (choices #CI_cfg #CI_df0 #CI_df1 #CI_df2 #CI_df3 #CI_rad #CI_ff0 #CI_ask)
          (help @askchoice-help)
        )
      )
      (select #CI_drive
        (set #CI_drive #CI_cfg)
        (set #CI_drive #CI_df0)
        (set #CI_drive #CI_df1)
        (set #CI_drive #CI_df2)
        (set #CI_drive #CI_df3)
        (set #CI_drive #CI_rad)
        (set #CI_drive #CI_ff0)
        (set #CI_drive
          (askstring
            (prompt "Select source drive for diskimages")
            (default "DF0:")
            (help @askstring-help)
          )
        )
      )
      (run ("setenv WHDLSrcDrv \"%s\"\ncopy ENV:WHDLSrcDrv ENVARC:" #CI_drive))
    )
  )
)

;----------------------------
; ask for source drive (RawDIC/Patcher installs)

(procedure P_AskSrcDrvRaw
  (set #dcnt 0)
  (set #CI_cfg (getenv "WHDLSrcDrvRaw"))
  (if (#CI_cfg)
    (if (getassign (substr #CI_cfg 0 (- (strlen #CI_cfg) 1)) "d")
      (set #dcnt (+ 1 #dcnt)) (set #CI_cfg "")
    )
  )
  (set #CI_df0 "")
  (if (<> "DF0:" #CI_cfg)
    (if (getassign "DF0" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df0 "DF0:")))
  )
  (set #CI_df1 "")
  (if (<> "DF1:" #CI_cfg)
    (if (getassign "DF1" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df1 "DF1:")))
  )
  (set #CI_df2 "")
  (if (<> "DF2:" #CI_cfg)
    (if (getassign "DF2" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df2 "DF2:")))
  )
  (set #CI_df3 "")
  (if (<> "DF3:" #CI_cfg)
    (if (getassign "DF3" "d") ((set #dcnt (+ 1 #dcnt)) (set #CI_df3 "DF3:")))
  )
  (if (< #dcnt 1)
    (set #CI_drive "DF0:")
    (if (> #dcnt 1)
      (
	(set #CI_drive
	  (askchoice
	    (prompt "Select source drive for diskimages")
	    (choices #CI_cfg #CI_df0 #CI_df1 #CI_df2 #CI_df3)
	    (help @askchoice-help)
	  )
	)
	(select #CI_drive
	  (set #CI_drive #CI_cfg)
	  (set #CI_drive #CI_df0)
	  (set #CI_drive #CI_df1)
	  (set #CI_drive #CI_df2)
	  (set #CI_drive #CI_df3)
	)
      )
      (set #CI_drive (cat #CI_cfg #CI_df0 #CI_df1 #CI_df2 #CI_df3))
    )
  )
  (run ("setenv WHDLSrcDrvRaw \"%s\"\ncopy ENV:WHDLSrcDrvRaw ENVARC:" #CI_drive))
)

;----------------------------
; Create Image using DIC
; #dest        - path to save image in
; #CI_disknum  - number of the disk image to create
; #CI_diskname - label of the disk
; #CI_disklen  - length of disk image to create
; #CI_skiptrk  - track to skip, -1 means no skip
; #CI_drive    - drive to create image from

(procedure P_CreateImage
  (PDI_AskMode)
  (set #DI_diskname #CI_diskname)
  (select #DI_mode
    ;0 = floppy
    (
      (P_AskSrcDrv)
      (message
        (cat
	  "\nInsert \"" #CI_diskname "\" into drive " #CI_drive "!\n\n"
	  "(make sure it's the right disk because it will not be checked)"
	)
      )
    )
    ;1 = adf
    (
      (set #CI_drive ("%s:" #DI_dev))
      (PDI_Mount)
      (PDI_AskImage)
      (PDI_Insert)
    )
    ;1 = warp
    (
      (set #CI_drive ("%s:" #DI_dev))
      (PDI_Mount)
      (PDI_AskImage)
      (PDI_Convert)
      (PDI_Insert)
    )
  )
  (if (= #CI_skiptrk "")
    (set #option "")
    (set #option (cat " SKIPTRACK=" #CI_skiptrk))
  )
  (if
    (= 0
      (run
        (cat
          "cd \"" #dest "\"\n"
          "DIC " #CI_drive " FD=" #CI_disknum " LD=" #CI_disknum " SIZE="
          #CI_disklen #option " PEDANTIC >CON:///1000//CLOSE"
        )
      )
    )
    (run ("FileNote \"%s.%ld\" \"%s\" Quiet" (tackon #dest "disk") #CI_disknum @app-name))
    (abort "\"DIC\" has failed to create a diskimage")
  )
)

;----------------------------
; Select a file (when unsure what disk the file exists on)
; IN:  #SF_prompt           - message to display when asking for the file
;      #SF_default_filename - default filename
; OUT: #SF_filename         - output filename or "" if nothing selected

(procedure P_SelectFile
  (set #SF_filename "")
  (set #SF_filename
    (askfile
      (prompt #SF_prompt)
      (help @askfile-help)
      (default #SF_default_filename)
    )
  )
)

;----------------------------
; copy file/directory including icon if exist
; #copy-file - name of file to copy

(procedure P_CopyFile
  (set #CF_type (exists #copy-file))
  (if #CF_type (
    (if (= #CF_type 2)
      ((copyfiles
          (help @copyfiles-help)
          (source #copy-file)
          (dest (tackon #dest #copy-file))
	  (all)
      ))
      ((copyfiles
          (help @copyfiles-help)
          (source #copy-file)
          (dest #dest)
      ))
    )
    (if (exists ("%s.info" #copy-file)) (
      (copyfiles
        (help @copyfiles-help)
        (source ("%s.info" #copy-file))
        (dest #dest)
      )
      (tooltype
        (dest (tackon #dest #copy-file))
        (noposition)
      )
    ))
  ))
)

;----------------------------
; copy a WHDLoad slave
; #icon_slave - name of the slave to copy (without .Slave extension)

(procedure P_CopySlave
  (copyfiles
    (help @copyfiles-help)
    (source ("%s.Slave" #icon_slave))
    (dest #dest)
  )
)

;----------------------------

(procedure P_Icon
  (copyfiles
    (help @copyfiles-help)
    (source ("%s.%s" #icon_prefix #icon-suf))
    (newname ("%s.info" #icon-name))
    (dest #icon-dir)
  )
  (tooltype
    (dest (tackon #icon-dir #icon-name))
    (noposition)
  )
)

;----------------------------
; Select an icon by presenting the user with a list of all found icons
; IN:  #icon_prefix - filename prefix for this icon (eg. intro, game)
;      #icon_desc   - description of the icon (eg. intro, game)
;      #icon_slave  - name of the slave the tooltype Slave= should be set 
;                     to (without the .slave suffix)

(procedure P_SelectIcon
  (set #icon 0)
  (set #icnt 0)
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_17)) ((set #icon 17)(set #icnt (+ 1 #icnt))(set #icon_17 #ico_desc_17)) (set #icon_17 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_16)) ((set #icon 16)(set #icnt (+ 1 #icnt))(set #icon_16 #ico_desc_16)) (set #icon_16 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_15)) ((set #icon 15)(set #icnt (+ 1 #icnt))(set #icon_15 #ico_desc_15)) (set #icon_15 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_14)) ((set #icon 14)(set #icnt (+ 1 #icnt))(set #icon_14 #ico_desc_14)) (set #icon_14 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_13)) ((set #icon 13)(set #icnt (+ 1 #icnt))(set #icon_13 #ico_desc_13)) (set #icon_13 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_12)) ((set #icon 12)(set #icnt (+ 1 #icnt))(set #icon_12 #ico_desc_12)) (set #icon_12 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_11)) ((set #icon 11)(set #icnt (+ 1 #icnt))(set #icon_11 #ico_desc_11)) (set #icon_11 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_10)) ((set #icon 10)(set #icnt (+ 1 #icnt))(set #icon_10 #ico_desc_10)) (set #icon_10 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_09)) ((set #icon 9) (set #icnt (+ 1 #icnt))(set #icon_09 #ico_desc_09)) (set #icon_09 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_08)) ((set #icon 8) (set #icnt (+ 1 #icnt))(set #icon_08 #ico_desc_08)) (set #icon_08 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_07)) ((set #icon 7) (set #icnt (+ 1 #icnt))(set #icon_07 #ico_desc_07)) (set #icon_07 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_06)) ((set #icon 6) (set #icnt (+ 1 #icnt))(set #icon_06 #ico_desc_06)) (set #icon_06 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_05)) ((set #icon 5) (set #icnt (+ 1 #icnt))(set #icon_05 #ico_desc_05)) (set #icon_05 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_04)) ((set #icon 4) (set #icnt (+ 1 #icnt))(set #icon_04 #ico_desc_04)) (set #icon_04 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_03)) ((set #icon 3) (set #icnt (+ 1 #icnt))(set #icon_03 #ico_desc_03)) (set #icon_03 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_02)) ((set #icon 2) (set #icnt (+ 1 #icnt))(set #icon_02 #ico_desc_02)) (set #icon_02 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_01)) ((set #icon 1) (set #icnt (+ 1 #icnt))(set #icon_01 #ico_desc_01)) (set #icon_01 ""))
  (if (exists ("%s.%s" #icon_prefix #ico_suffix_00)) ((set #icon 0) (set #icnt (+ 1 #icnt))(set #icon_00 #ico_desc_00)) (set #icon_00 ""))
  (if (> #icnt 1) (
    (if (= #newstuff 1) (
      (set #icon-dir ("T:%s Icons" #icon_prefix))
      (makedir #icon-dir
        (help @makedir-help)
      )
      (if #icon_00 ((set #icon-suf #ico_suffix_00) (set #icon-name #ico_desc_00) (P_Icon)))
      (if #icon_01 ((set #icon-suf #ico_suffix_01) (set #icon-name #ico_desc_01) (P_Icon)))
      (if #icon_02 ((set #icon-suf #ico_suffix_02) (set #icon-name #ico_desc_02) (P_Icon)))
      (if #icon_03 ((set #icon-suf #ico_suffix_03) (set #icon-name #ico_desc_03) (P_Icon)))
      (if #icon_04 ((set #icon-suf #ico_suffix_04) (set #icon-name #ico_desc_04) (P_Icon)))
      (if #icon_05 ((set #icon-suf #ico_suffix_05) (set #icon-name #ico_desc_05) (P_Icon)))
      (if #icon_06 ((set #icon-suf #ico_suffix_06) (set #icon-name #ico_desc_06) (P_Icon)))
      (if #icon_07 ((set #icon-suf #ico_suffix_07) (set #icon-name #ico_desc_07) (P_Icon)))
      (if #icon_08 ((set #icon-suf #ico_suffix_08) (set #icon-name #ico_desc_08) (P_Icon)))
      (if #icon_09 ((set #icon-suf #ico_suffix_09) (set #icon-name #ico_desc_09) (P_Icon)))
      (if #icon_10 ((set #icon-suf #ico_suffix_10) (set #icon-name #ico_desc_10) (P_Icon)))
      (if #icon_11 ((set #icon-suf #ico_suffix_11) (set #icon-name #ico_desc_11) (P_Icon)))
      (if #icon_12 ((set #icon-suf #ico_suffix_12) (set #icon-name #ico_desc_12) (P_Icon)))
      (if #icon_13 ((set #icon-suf #ico_suffix_13) (set #icon-name #ico_desc_13) (P_Icon)))
      (if #icon_14 ((set #icon-suf #ico_suffix_14) (set #icon-name #ico_desc_14) (P_Icon)))
      (if #icon_15 ((set #icon-suf #ico_suffix_15) (set #icon-name #ico_desc_15) (P_Icon)))
      (if #icon_16 ((set #icon-suf #ico_suffix_16) (set #icon-name #ico_desc_16) (P_Icon)))
      (if #icon_17 ((set #icon-suf #ico_suffix_17) (set #icon-name #ico_desc_17) (P_Icon)))
      (openwbobject #icon-dir)
    ))
    (set #icon
      (askchoice
        (prompt ("\nWhich %s icon would you like to install?\n" #icon_desc))
	(choices #icon_00 #icon_01 #icon_02 #icon_03 #icon_04 #icon_05 #icon_06 #icon_07 #icon_08 #icon_09 #icon_10 #icon_11 #icon_12 #icon_13 #icon_14 #icon_15 #icon_16 #icon_17)
        (default #icon)
        (help @askchoice-help)
      )
    )
    (if (= #newstuff 1) (
      (closewbobject #icon-dir)
      (run ("Delete \"%s\" All Quiet Force" #icon-dir))
    ))
  ))
  (if (> #icnt 0) (
    (select #icon
      (set #icon #ico_suffix_00)
      (set #icon #ico_suffix_01)
      (set #icon #ico_suffix_02)
      (set #icon #ico_suffix_03)
      (set #icon #ico_suffix_04)
      (set #icon #ico_suffix_05)
      (set #icon #ico_suffix_06)
      (set #icon #ico_suffix_07)
      (set #icon #ico_suffix_08)
      (set #icon #ico_suffix_09)
      (set #icon #ico_suffix_10)
      (set #icon #ico_suffix_11)
      (set #icon #ico_suffix_12)
      (set #icon #ico_suffix_13)
      (set #icon #ico_suffix_14)
      (set #icon #ico_suffix_15)
      (set #icon #ico_suffix_16)
      (set #icon #ico_suffix_17)
    )
    (copyfiles
      (help @copyfiles-help)
      (source ("%s.%s" #icon_prefix #icon))
      (newname ("%s.info" #icon_prefix))
      (dest #dest)
    )
    ;installer has problems on deleting tooltypes with newicons
    (if (<> (substr #icon 0 3) "new")
      (tooltype
        (dest (tackon #dest #icon_prefix))
        (settooltype "Slave")
        (settooltype "PreLoad")
      )
    )
    (tooltype
      (dest (tackon #dest #icon_prefix))
      (settooltype "PreLoad" "")
      (settooltype "Slave" ("%s.Slave" #icon_slave))
    )
    (tooltype
      (dest (tackon #dest #icon_prefix))
      (setdefaulttool "WHDLoad")
      (setstack 10240)
      (noposition)
    )
  ))
)

;****************************

(if (< @installer-version (+ (* 44 65536) 10))
  (
    (message
      (cat
        "Warning: your installer is outdated.\n"
        "Some features of this installation won't be available, "
        "such as icon show and drawer opening. "
        "You have version " (/ @installer-version 65536) "." 
        (BITAND @installer-version 65535) ", recommended is version 44.10. "
        "The 'installer' 44.10 comes with OS 3.5 but is also contained in the NDK 3.9. "
        "You may also use InstallerNG by Jens Trger."
        "\n\n"
        "The installers can be obtained from the net:\n"
        "http://www.amiga.com/3.9/download/NDK3.9.lha\n"
        "aminet:util/sys/InstallerNG.lha"
      )
    )
    (set #newstuff 0)
  )
  (set #newstuff 1)
)

(if (exists #readme-file)
  (if (= 0 (run ("SYS:Utilities/Multiview %s" #readme-file)))
    ("")
    (run ("SYS:Utilities/More %s" #readme-file))
  )
)

(set #program "WHDLoad")
(P_ChkRun)

(set #program "RawDIC")
(P_ChkRun)

(set #program "Patcher")
(P_ChkRun)

(set #program "DIC")
(P_ChkRun)

(if (getenv "WHDLInstPath")
  (set @default-dest (getenv "WHDLInstPath"))
)

(P_SelectVersion)
(if (= #prefix-slave "") (set #prefix-slave #prefix))

(set #dest
  (askdir
    (prompt
      (cat
	"Where should \"" @app-name "\" be installed?\n"
	"A drawer \"" #prefix "\" will be automatically created."
      )
    )
    (help @askdir-help)
    (default @default-dest)
  )
)
(run ("setenv WHDLInstPath \"%s\"\ncopy ENV:WHDLInstPath ENVARC:" #dest))
(set #dest (tackon #dest #prefix))
(if (exists #dest) (
  (set #choice
    (askbool
      (prompt
        (cat
          "\nDirectory \"" #dest "\" already exists.\n"
          "Should it be deleted?"
        )
      )
      (default 1)
      (choices "Delete" "Skip")
      (help @askbool-help)
    )
  )
  (if (= #choice 1)
    (run ("Delete \"%s\" \"%s.info\" All Quiet Force" #dest #dest))
  )
))
(makedir #dest
  (help @makedir-help)
  (infos)
)

;----------------------------

(P_MakeIcons)
(set #copy-file #readme-file)
(P_CopyFile)
(set #copy-file #man-file)
(P_CopyFile)
(set #copy-file #hint-file)
(P_CopyFile)
(set #copy-file #sol-file)
(P_CopyFile)
(set #copy-file #extra-file)
(P_CopyFile)
(set #copy-file #extra2-file)
(P_CopyFile)
(set #copy-file #extra3-file)
(P_CopyFile)
(set #dest-org #dest)
(if (= #sub-dir "")
  ("")
  (
    (set #dest (tackon #dest #sub-dir))
    (makedir #dest
      (help @makedir-help)
    )
  )
)
(set #copy-file #highs-file)
(P_CopyFile)
(P_MakeImages)
(if (= #newstuff 1)
  (openwbobject #dest-org)
)
(set @default-dest #dest-org)
(exit)
